home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / ptv1n4.arc / CDECL.PRO next >
Text File  |  1990-09-13  |  10KB  |  285 lines

  1. heap=$600
  2.  
  3. CONSTANTS
  4.  needsdos_cantreenter = $0005
  5.  leftShift        = $0002           
  6.  key_F2      = $3c
  7.  swaptoems       = $8000
  8.  swaptofile      = $4000
  9.  
  10. GLOBAL PREDICATES
  11. %  from the TSR Library
  12.  enableResident(string, integer) - (i, i) language c
  13.  stayResident - language c
  14.  enableSwap(integer, string, string, integer) - (i, i, i, o) language c
  15.  installHotkey(integer, integer, integer, integer) - (i, i, i, i) language c
  16.  setStatusHotKey(integer, string) - (i, i) language c
  17.  setKeyboardSense(string) - (i) language c
  18.  stuffBIOSKeys(string, integer) - (i, i) language c
  19.  saveVideo(integer, integer, integer, integer ) - (i, i, o, o) language c
  20.  wasGraphics - language c
  21. % defined here but called by Library
  22.  hotkey(integer) - (i)
  23.  
  24. DOMAINS
  25.  dir        = vert(integer,integer); horiz(integer,integer)
  26.  keyact        = clip; move(dir); size(dir)
  27.  stringlist     = string*
  28.  paste_style     = as_program ; as_comment 
  29.  paren_control  = add_parens; no_parens
  30.  
  31. PREDICATES
  32.  enable_best_swapping
  33.  screen_read(integer, integer, integer, integer, string)
  34.  getkeyAction(keyact)
  35.  keyAct(char, integer,integer,integer,integer,integer,integer,keyact)
  36.  keyAct2(char,integer, integer, integer, integer,keyact)
  37.  reposition(keyact, integer,integer,integer,integer, 
  38.              integer,integer,integer,integer)
  39.  delta(dir, integer,integer,integer,integer)
  40.  legal(integer,integer,integer,integer)
  41.  starting_width(integer,integer,integer,integer)
  42.  scan_to_edge(integer,integer,integer,integer)
  43.  is_skip_char(char)
  44.  
  45.  translate(string, string, paste_style)
  46.  add_formatting(paste_style, string, string)
  47.  parse(stringlist, string, paste_style)
  48.  remove_extraneous(stringlist,stringlist)
  49.  nondeterm  cdecl(stringlist,stringlist,string,string)
  50.  nondeterm  cdecl1(stringlist,stringlist,string,string)
  51.  nondeterm  cdecl2(stringlist,stringlist,string,string)
  52.  cdims(stringlist,stringlist,string)    
  53.  adecl(stringlist, string,string,string, paren_control) 
  54.  mayParenthesize(paren_control, string,string,string,string)
  55.  untokenize(stringlist, string)
  56.  is_legal_type(stringlist,stringlist,string)
  57.  modifier(stringlist,stringlist)
  58.  may_start_with(stringlist,stringlist,stringlist)
  59.  append(Stringlist,stringlist,stringlist)    
  60.  member(string, stringlist)
  61.  number(string)
  62.  tokenize(String,stringlist)
  63.  
  64. CLAUSES
  65.         hotKey(1) :- wasGraphics,!, fail.  
  66.     hotKey(1) :-
  67.         setStatusHotKey(1,off),
  68.         textmode(Rows,ColsWide),
  69.         saveVideo(Rows,ColsWide, CurrentRow,_),
  70.         setkeyboardsense(on),
  71.         starting_width(CurrentRow,ColsWide, StartCol, Wide),
  72.         screen_read(CurrentRow,StartCol, 1, Wide, TextClipped),
  73.         translate(TextClipped, NewText, PasteStyle),
  74.         add_formatting(PasteStyle, NewText, TextToPaste),
  75.         setStatusHotKey(1,on),
  76.         stuffBiosKeys(TextToPaste, 0),!. % 0 => as fast as possible
  77.     hotkey(1) :-
  78.         makewindow(2,7,7,"", 2,5,3,20),
  79.         write("can't parse this!"),    
  80.         readchar(_),
  81.         removewindow,
  82.         setStatusHotKey(1,on).
  83.  
  84.     
  85.     add_formatting(as_comment, Text, Paste) :- % home, cr, up
  86.         format(Paste, "\255G\013\255H/*\n %s\n */", Text).
  87.     add_formatting(as_program, Code, Paste) :- % home,dn,dn, cr,up,tab...
  88.         format(Paste, "\255G\255P\255P\013\255H\t%s; \n\n", Code). 
  89.  
  90.     screen_read(R,C,H,W, Screen) :-
  91.         makewindow(1,112,0,"",R,C,H,W,0,0,""),
  92.         window_attr(112),
  93.         getkeyAction(Action),
  94.         reposition(Action, R,C,H,W, R2,C2,H2,W2),
  95.         not(Action=clip), !,
  96.         removewindow,
  97.         screen_read(R2,C2,H2,W2, Screen).
  98.     screen_read(_,_,_,_,SCR) :-
  99.         window_str(Scr),
  100.         removewindow.
  101.  
  102.     reposition(clip, Row,Col,High,Wide,Row,Col,High,Wide).
  103.     reposition(move(Axis), Row,Col,High,Wide, Row2,Col2,High,Wide) :-
  104.         delta(Axis, Row,Col,Row2,Col2).
  105.     reposition(size(Axis), Row,Col,High,Wide, Row,Col,High2,Wide2) :-
  106.         delta(Axis, High,Wide, High2,Wide2).
  107.     
  108.     delta(horiz(Amt, Limit), R, C, R, C2) :- legal(C,C2,Amt,Limit),!.
  109.     delta(vert(Amt, Limit), R, C, R2, C) :-  legal(R,R2,Amt,Limit),!. 
  110.     delta(_, R,C,R,C).     % at limit, dont change 
  111.  
  112.     legal(Old,Value, Amt, OverLimit) :- Value=Old+Amt, Value<>OverLimit.
  113.             
  114.     getkeyAction(KeyAct):-    
  115.         textmode(MaxRows,MaxCols),
  116.         makewindow(_,_,_,_,Row, Col, High, Wide), % get current params
  117.         readchar(Char),
  118.         keyAct(Char,Row,Col,High,Wide, MaxRows, MaxCols,KeyAct).
  119.  
  120.     keyAct(0, R,C,_,_,Mr, Mc, KEY) :-
  121.         readchar(Char),
  122.         keyAct2(Char, R,C, Mr, Mc, Key).
  123.            keyAct(13,_,_,_,_,_,_,clip).
  124.     keyAct('4',_,_,_,_,_,_,move(horiz(-1,-1))).
  125.     keyAct('8',_,_,_,_,_,_,move(vert(-1,-1))).
  126.     keyAct('6',_,_,_,Wide,_,MaxCols,move(horiz(1,Lim))):- 
  127.         Lim = MaxCols - Wide + 1.
  128.     keyAct('2',_,_,High,_,MaxRows,_,move(vert(1,Lim))):- 
  129.         Lim = MaxRows - High + 1.
  130.     
  131.     keyAct2('K', _,_,_,_,size(horiz(-1,0))).
  132.     keyAct2('H', _,_,_,_,size(vert(-1,0))).
  133.     keyAct2('P', StartRow,_,MaxRows,_,size(vert(1,Lim))):- 
  134.         Lim= MaxRows - StartRow + 1.  
  135.     keyAct2('M', _,StartCol,_,MaxCols, size(horiz(1,Lim))):- 
  136.         Lim=MaxCols - StartCol + 1.
  137.  
  138.  
  139.     translate(Input, OutPut, ResultType):-
  140.         upper_lower(Input, LowInput),
  141.         tokenize(LowInput, Tokens),
  142.         remove_extraneous(Tokens, RealTokens),
  143.         parse(RealTokens, OutPut, ResultType).
  144.     
  145.     remove_extraneous(["/","*"|Rest],Result) :- 
  146.         !, remove_extraneous(Rest, Result).
  147.     remove_extraneous(Tokens, Result) :-
  148.         append(Result, [";"], Tokens),!;
  149.         append(Result, ["*","/"], Tokens),!.
  150.     remove_extraneous(Same, Same).
  151.  
  152.  
  153.     parse([declare,Name,as|Declaration], Result, as_program) :-
  154.         adecl(Declaration, Pre, Post, Type, _),!,
  155.         format(Result, "%s %s%s%s", Type, Pre, Name, Post).
  156.       parse([cast,Name,into|Declaration],Result, as_program) :-
  157.         adecl(Declaration, Pre, Post, Type, _),!,
  158.         format(Result, "(%s %s%s)%s", Type, Pre, Post, Name).
  159.       parse(Cexpr, Comment, as_comment) :-
  160.         is_legal_type(Cexpr, Rest, Typestr),
  161.         cdecl(Rest, Done, DecStr, Name), Done=[],!,
  162.         format(Comment, "declare % as%s %s", Name, DecStr, Typestr).
  163.     
  164.     cdecl(["*","("|RDec], Rest, Dec, Name) :-
  165.         cdecl(Rdec, R2, Dec1, Name),R2=[")"|Rest],
  166.         format(Dec," pointer to%", Dec1).
  167.       cdecl(["*"|Rdec], Rest, Dec, Name) :- !,
  168.         cdecl(Rdec, Rest, Dec1, Name), 
  169.         format(Dec, "%s pointer to", Dec1).
  170.       cdecl(X, R, Dec, Name) :- cdecl1(X, R, Dec, Name).
  171.  
  172.       cdecl1(X,R2, Dec, Name) :-
  173.         cdecl2(X, R1, Dec2, Name), R1=["(",")"|R2],!,
  174.         format(Dec, "%s function returning", Dec2).
  175.       cdecl1(X, Rest, Dec, Name) :-
  176.         cdecl2(X, R2, Dec2, Name),
  177.         cdims(R2,Rest, Dims),!,
  178.         format(Dec, "%s array %s",Dec2, Dims).
  179.     cdecl1(X,R,D,N) :- cdecl2(X,R,D,N).
  180.      
  181.       cdecl2(["(" | SubDec],  Rest, Dec, Name) :-
  182.           cdecl(SubDec, Rem,Dec, Name), Rem=[")"|Rest],!.
  183.       cdecl2([Name|Rest], Rest, "", Name).
  184.  
  185.       cdims(["[","]"|R],R, "of"):-!.
  186.       cdims(["[", Number, "]"|R],R, Res) :- 
  187.         number(Number),
  188.         concat(Number," of",Res).
  189.   
  190.     adecl([function,"(",Name,")",returning|Decl],Left,Right,Type,add_parens) :-
  191.         adecl(Decl,Left,Right1,Type, _),!,
  192.         format(Right, "(%s)%s", Name, Right1).    
  193.       adecl([function,returning|Decl],Left,Right,Type,add_parens) :-
  194.         adecl(Decl,Left,Right1,Type, _),!,
  195.         concat("()", Right1, Right).
  196.       adecl([array,Number,of|Decl],Left,Right,Type,add_parens) :-
  197.         number(Number),!,
  198.         adecl(Decl, Left, Right1, Type, _),
  199.         format(Right,"[%s]%s", Number, Right1).
  200.       adecl([array,of|Decl], Left, Right, Type,add_parens) :-
  201.         adecl(Decl, Left,Right1,Type, _),!,
  202.         format(Right, "[]%s", Right1).
  203.       adecl([pointer,to|Decl], Left, Right, Type, no_parens) :-!,
  204.         adecl(Decl,Left1, Right1, Type, Parens),!,
  205.         mayParenthesize(Parens, Left1, Right1, Left, Right).
  206.       adecl(Type, "","", Typestr,no_parens) :-
  207.         is_legal_type(Type,[], TypeStr),!.
  208.  
  209.     mayParenthesize(add_parens, Left, Right, NewLeft, NewRight) :-!,
  210.         concat(Left, "(*", NewLeft),
  211.         concat(")",Right, NewRight). 
  212.     mayParenthesize(no_parens,Left,Right, NewLeft,Right) :- 
  213.         concat("*",Left,NewLeft).
  214.  
  215.       is_legal_type(Input,Rest, TypeString) :-
  216.         modifier(Input, R2),
  217.         may_start_with(R2, [int,char,float,double,void],Rest),
  218.         append(TypeList, Rest, Input),!,
  219.         untokenize(TypeList, TypeString).    
  220.       is_legal_type([UnionStruct,Name|Rest],Rest, TypeStr) :-
  221.         untokenize([UnionStruct,Name], TypeStr). % a bit loose...
  222.  
  223.       modifier(X,Y) :-
  224.         may_start_with(X, [unsigned], X2),
  225.         may_start_with(X2, [short, long], Y).
  226.  
  227.       may_start_with([X|Y],List, Y) :- member(X,List),!.
  228.       may_start_with(Y, _, Y).
  229.  
  230.       member(X,[X|_]) :-!.
  231.       member(X,[_|Y]) :- 
  232.         member(X,Y).
  233.     
  234.       append([],X,X):-!.
  235.      append([X|Y], Z, [X|Z2]) :-
  236.         append(Y,Z,Z2).
  237.  
  238.       number(STR) :- str_int(STR,_).
  239.  
  240.     tokenize(String, Result) :-        
  241.         fronttoken(String, Token, Rest), 
  242.         member(Token, [a, an]),         % ignore these as noise words
  243.         !,tokenize(Rest, Result).
  244.     tokenize(String, [Head|Tail]) :-
  245.         fronttoken(String, Head, Rest),
  246.         !,tokenize(Rest, Tail).
  247.       tokenize(_, []).
  248.  
  249.       untokenize([X],X) :-!.
  250.       untokenize([H|T], Res) :-
  251.         untokenize(T, RT),
  252.         format(Res, "% %", H, RT).
  253.  
  254.  
  255.     starting_width(Row, ColsWide, StartCol, Wide) :-
  256.         makewindow(1, 7, 0, "", Row, 0, 1, ColsWide,0,0,""),
  257.         LastCol = ColsWide-1,
  258.         scan_to_edge(LastCol, 0,1, StartCol),
  259.         scan_to_edge(LastCol, LastCol,-1,  EndCol),
  260.         removewindow,
  261.         Wide = EndCol + 1 - StartCol, 
  262.         Wide > 1,!.
  263.     starting_width( _, _, 0, 80).
  264.  
  265.     scan_to_edge(MaxCol, Col,Step, Edge) :-
  266.         scr_char(0, Col, Char),
  267.         is_skip_char(Char),
  268.         C2 = Col + Step,
  269.         C2>=0,C2<=MaxCol,
  270.         !,scan_to_edge(MaxCol,C2, Step, Edge).
  271.     scan_to_edge(_, Col, _, Col).
  272.  
  273.     is_skip_char(C) :- C<33,! ; C>127.
  274.     
  275.     enable_best_swapping :- enableSwap(swapToEms,"","",Stat), Stat=0,!.
  276.     enable_best_swapping :- enableSwap(swapToFile,"","",Stat), Stat=0,!.
  277.     enable_best_swapping.
  278.  
  279. GOAL
  280.     enableResident("chelper",0),     % id=prog name, no resident buffer
  281.     enable_best_swapping,        
  282.     installHotKey(1, key_f2, leftShift, needsDos_cantReenter),
  283.     stayResident.
  284.  
  285.